package io.renren.common.utils;

import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.commons.lang.time.DateUtils;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;

public class DateUtil {
    
	//private static String deaultDateTimeFormat = "yyyy-MM-dd HH:mm:ss";
	private static String deaultDateFormat = "yyyy-MM-dd";
	
	/**
	 * 获得两个时间差
	 * @param endDate
	 * @param nowDate
	 * @param type 1天；2小时3分钟
	 * @return
	 */
	public static int getDatePoor(Date endDate, Date nowDate,int type) {
		long diff2;
	    long nd = 1000 * 24 * 60 * 60;
	    long nh = 1000 * 60 * 60;
	    long nm = 1000 * 60;
	    // long ns = 1000;
	    // 获得两个时间的毫秒时间差异
	    long diff = endDate.getTime() - nowDate.getTime();
	    if(type==1){//天
	    	diff2 = diff / nd;
	    }else if(type==2){//小时
	    	//diff2 = diff % nd / nh;
	    	diff2 = diff / nh;
	    }else{//分钟
	    	//diff2 = diff % nd % nh / nm;
	    	diff2 = diff / nm;
	    }
	    
	    return (int) diff2;
	 
	}
	/**
	 * 获得两个时间差分钟数
	 * @param endDate
	 * @param nowDate
	 * @param type 1天；2小时3分钟
	 * @return
	 */
	public static int getDateMinute(Date endDate, Date nowDate) {
		long diff2;
	    long nm = 1000 * 60;
	    // long ns = 1000;
	    // 获得两个时间的毫秒时间差异
	    long diff = endDate.getTime() - nowDate.getTime();
	    diff2 = diff / nm;
	    return (int) diff2;
	}
	
	//返回上个月的月份
	public static String getLastMonth(){
		  Calendar c = Calendar.getInstance();
		  c.add(Calendar.MONTH, -1);
		  SimpleDateFormat format =  new SimpleDateFormat("yyyy-MM");
		  String time = format.format(c.getTime());
		  return time;
	}
	
	/**
     * 格式化日期和时间，并按格式转换为字符串
     * 例：20040430172703
     * @param date 要格式化的日期
     * @return 返回日期和时间
     * @author zly
     */
    public static String formatDateTime1(Date date) {
    	if(date == null) {
    		return "";
    	}
    	SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        return sdf.format(date);
    }
    /**
     * 格式化日期和时间，并按格式转换为字符串
     * 例：2004-04-30T17:27:03
     * @param date 要格式化的日期
     * @return 返回日期和时间
     * @author WANGYP
     */
    public static String formatDateTimes(Date date) {
    	if(date == null) {
    		return "";
    	}
    	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		SimpleDateFormat sdf1 =new SimpleDateFormat("HH:mm:ss");
        String str= sdf.format(date)+"T"+sdf1.format(date);
        return str;
    }
    
    /**
     * 格式化日期和时间，并按格式转换为字符串
     * 例：2004-04-30T17:27:03
     * @param date 要格式化的日期
     * @return 返回日期和时间
     * @author WANGYP
     */
    public static Date formatDateTime6(String DateTime) {
    	String Date = DateTime.split("T")[0];
    	String Time = DateTime.split("T")[1];
    	String DateTimes = Date+" "+Time;
       
        return parseStringToDate2(DateTimes);
    }
    
    
    
	/**
	 * 将yyyyMMddHHMMSS类型的字符串转换为Date类型
	 * @param str 需要转换的日期字符串
	 * @return 转换后的日期
	 */
	public static Date parseStringToDateTime2(String str){
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
		try {
			return dateFormat.parse(str);
		} catch (Exception ex) {
			return null;
		}
	}
	/**
	 * 将yyyyMMddHHMM类型的字符串转换为Date类型
	 * @param str 需要转换的日期字符串
	 * @return 转换后的日期
	 */
	public static Date parseStringToDateTime3(String str){
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmm");
		try {
			return dateFormat.parse(str);
		} catch (Exception ex) {
			return null;
		}
	}
	/**
	 * 将yyyyMMddHH类型的字符串转换为Date类型
	 * @param str 需要转换的日期字符串
	 * @return 转换后的日期
	 */
	public static Date parseStringToDateTime4(String str){
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHH");
		try {
			return dateFormat.parse(str);
		} catch (Exception ex) {
			return null;
		}
	}
	/**
	 * 将yyyyMMdd类型的字符串转换为Date类型
	 * @param str 需要转换的日期字符串
	 * @return 转换后的日期
	 */
	public static Date parseStringToDateTime5(String str){
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
		try {
			return dateFormat.parse(str);
		} catch (Exception ex) {
			return null;
		}
	}
    /**
     * 返回当前的小时
     */
    public static int getHour() {
//    	GregorianCalendar gcNow = new GregorianCalendar();
//    	return gcNow.get(Calendar.HOUR);
    	Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        return calendar.get(Calendar.HOUR_OF_DAY);
    }
   
    /**
  	 * 返回一个当前的完整时间，并按格式转换为字符串
  	 * 例：20091103135046125
  	 */
  	public static String getFullDateString() {
  		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmssSS");
  		return dateFormat.format(new Date());
  	}
  	 /**
  	 * 返回一个当前的完整时间，并按格式转换为字符串
  	 * 例：yyyyMMddHHmmssSSS
  	 */
  	public static String getFullDateStringSSS() {
  		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS");
  		return dateFormat.format(new Date());
  	}
  	 /**
  	 * 返回一个当前时间的年月日，并按格式转换为字符串
  	 * 例：20141216
  	 */
	public static String getFullDateString3() {
  		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
  		return dateFormat.format(new Date());
  	}
  	/**
  	 * 返回一个当前的完整时间，并按格式转换为字符串
  	 * 例：20091103135046125
  	 * 2014121211524362
  	 */
  	public static String getFullDateString2() {
  		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
  		return dateFormat.format(new Date());
  	}
    
    /**
  	 * 返回一个当前的完整时间，并按格式转换为字符串
  	 * 例：200911031300
  	 */
  	public static String getFullDateMinute(Date date) {
  		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmm");
  		return dateFormat.format(date);
  	}
  	 /**
  	 * 返回一个当前的完整时间，并按格式转换为字符串
  	 * 例：2009110313
  	 */
  	public static String getFullDateHour(Date date) {
  		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHH");
  		return dateFormat.format(date);
  	}
	 /**
  	 * 返回一个当前的完整时间，并按格式转换为字符串
  	 * 例：20091103
  	 */
  	public static String getFullDateDay(Date date) {
  		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
  		return dateFormat.format(date);
  	}
    /**
     * 返回当前的分钟
     * @return int 返回当前的分钟
     */
    public static int getMinute() {
    	GregorianCalendar gcNow = new GregorianCalendar();
    	return gcNow.get(Calendar.MINUTE);
    }
    
    /**
     * 返回当前的秒数
     * @return int 第几秒
     */
    public static int getSecond() {
    	GregorianCalendar gcNow = new GregorianCalendar();
    	return gcNow.get(Calendar.SECOND);
    }
    
	/**
     * 返回今天是本月的第几天
     */
    public static int getToDayOfMonth() {
        GregorianCalendar gcNow = new GregorianCalendar();
        return gcNow.get(Calendar.DAY_OF_MONTH);
    }
    
    /**
     * 返回今天是本年的第几周 
     * @return int 从1开始
     */
    public static int getToWeekOfYear() {
    	GregorianCalendar gcNow = new GregorianCalendar();
    	return gcNow.get(Calendar.WEEK_OF_YEAR);
    }
	
    /**
     * 返回本月
     */
    public static int getThisMonth() {
        GregorianCalendar gcNow = new GregorianCalendar();
        return gcNow.get(Calendar.MONTH) + 1;
    }
	
    /**
     * 返回当前年
     */
    public static int getThisYear() {
        GregorianCalendar gcNow = new GregorianCalendar();
        return gcNow.get(Calendar.YEAR);
    }
	
    /**
     * 返回一个当前的时间，并按格式转换为字符串
     * 例：17:27:03
     */
    public static String getNowTime() {
        GregorianCalendar gcNow = new GregorianCalendar();
        Date dNow = gcNow.getTime();
        DateFormat df = DateFormat.getTimeInstance(DateFormat.MEDIUM, Locale.SIMPLIFIED_CHINESE);
        return df.format(dNow);
    }
	
    /**
     * 返回一个当前日期，并按格式转换为字符串
     * 例：2004-4-30
     */
	public static String getNowDate() {
		return DateUtil.parseDateToString(new Date());
	}
	
    /**
     * 返回一个当前日期和时间，并按格式转换为字符串
     * 例：2004-4-30 17:27:03
     */
    public static String getNowDateTime() {
//      GregorianCalendar gcNow = new GregorianCalendar();
//      java.util.Date dNow = gcNow.getTime();
//      DateFormat df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.SIMPLIFIED_CHINESE);
//      return df.format(dNow);
  	return formatDateTime(new Date());
  }
	
	/**
	 * 计算两日期之间的天数
	 * @param sd 起始日期，格式yyyy-MM-dd
	 * @param ed 终止日期，格式yyyy-MM-dd
	 * @return 天数
	 */
	public static long getIntervalDay(String sd, String ed) {
		return ((java.sql.Date.valueOf(ed)).getTime() - (java.sql.Date.valueOf(sd)).getTime()) / (3600 * 24 * 1000);
	}

	/**
	 * 计算两日期之间的月数
	 * @param String startT 开始日期
	 * @param String endT 结束日期
	 * @return int 月数
	 */
	public static int getIntervalMonth(String startT, String endT) {
		startT = formatDate(startT);
		endT = formatDate(endT);
		int i = Integer.parseInt(startT.substring(0, 4));
		int j = Integer.parseInt(endT.substring(0, 4));
		int i1 = Integer.parseInt(startT.substring(5, 7));
		int j1 = Integer.parseInt(endT.substring(5, 7));
		return (j - i) * 12 + (j1 - i1);
	}
	
	/**
	 * 计算两日期之间的年数
	 * @param startT 开始日期
	 * @param endT 结束日期
	 * @return int 年数
	 */
	public static int getIntervalYear(String startT, String endT) {
		startT = formatDate(startT);
		endT = formatDate(endT);
		int i = Integer.parseInt(startT.substring(0, 4));
		int j = Integer.parseInt(endT.substring(0, 4));
		return j - i;
	}
	
	/**
	 * 将yyyy-MM-dd hh 类型的字符串转换为Date类型 如果字符串日期不合法
	 * @param str 需要转换的日期字符串
	 * @return 转换后的日期类型
	 */
	public static Date parseStrToDate(String str) {
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH");
		try {
			return dateFormat.parse(str);
		} catch (Exception ex) {
			System.out.println("DateUtils.java : " + ex.getMessage());
			return null;
		}
	}
	/**
	 * 将yyyy-MM类型的字符串转换为Date类型 如果字符串日期不合法
	 * @param str 需要转换的日期字符串
	 * @return 转换后的日期类型
	 */
	public static Date myDate(String str) {
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM");
		try {
			return dateFormat.parse(str);
		} catch (Exception ex) {
			System.out.println("DateUtils.java : " + ex.getMessage());
			return null;
		}
	}
	
	
	//用于字符串转换为数字
	public static int[] toInt(String str) {
		char[] temp = str.toCharArray();
		String str1 = "";
		int[] save = new int[3];
		int k = 0;
		int date;
		for(int i=0;i<=temp.length;i++) {
			if( i == temp.length ) {
				date = Integer.parseInt(str1);
				str1="";
				save[k] = date;
				k++;
			}else if( temp[i] != '-' ) {
				str1 = str1 +temp[i];
			}else {
				date = Integer.parseInt(str1);
				str1="";
				save[k] = date;
				k++;
			}
		}
		return save;
	}

	
	/**
	 * 将yyyy-MM-dd类型的字符串转换为Date类型 如果字符串日期不合法
	 * @param str 需要转换的日期字符串
	 * @return 转换后的日期类型
	 */
	public static Date parseStringToDate(String str) {
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		try {
			return dateFormat.parse(str);
		} catch (Exception ex) {
			System.out.println("DateUtils.java : " + ex.getMessage());
			return null;
		}
	}
	
	public static  Date parseStringToDate2(String str) {
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		try {
			return dateFormat.parse(str);
		} catch (Exception ex) {
			System.out.println("DateUtils.java : " + ex.getMessage());
			return null;
		}
	}
	
	
	
	/**
	 * 将Date类型数据转换为yyyy-MM-dd字符串
	 * @param date 需要转换的日期
	 * @return 转换后的字符串
	 */
	public static String parseDateToString(Date date) {
		return DateFormatUtils.ISO_DATE_FORMAT.format(date);
	}
	
	
	/**
	 * 得到指定日期的加，减分钟数后的字符串日期。
	 * @param str 指定的日期
	 * @param minute 加减的分钟
	 * @return 计算后的日期
	 */
	public static String getAddMinus(String str, int minute) {
		Date date = parseStringToDateTime3(str);
		return getFullDateMinute(DateUtils.addMinutes(date, minute));
	}
	
	/**
	 * 得到指定日期的加，减分钟数后的字符串日期。
	 * @param str 指定的日期
	 * @param minute 加减的分钟
	 * @return 计算后的日期
	 */
	public static String getAddHour(String str, int hour) {
		Date date = parseStringToDateTime4(str);
		return getFullDateHour(DateUtils.addHours(date, hour));
	}
	/**
	 * 得到指定日期的加，减天数后的字符串日期。
	 * @param str 指定的日期
	 * @param day 加减的天数
	 * @return 计算后的日期
	 */
	public static String getAddDays(String str, int day) {
		Date date = parseStringToDate(str);
		return parseDateToString(DateUtils.addDays(date, day));
	}
	
	
	/**
	 * 得到指定日期的加，减天数后的字符串日期。
	 * @param str 指定的日期
	 * @param day 加减的天数
	 * @return 计算后的日期
	 */
	public static String getAddDays2(String str, int day) {
		Date date = parseStringToDateTime5(str);
		return getFullDateDay(DateUtils.addDays(date, day));
	}
	
	/**
	 * 得到指定日期的加，减星期数后的字符串日期。
	 * @param str 指定的日期
	 * @param week 加减的星期数
	 * @return 计算后的日期
	 */
	public static String getAddWeeks(String str, int week) {
		Date date = parseStringToDate(str);
		return parseDateToString(DateUtils.addWeeks(date, week));
	}
	
	/**
	 * 得到指定日期的加，减月数后的字符串日期。
	 * @param str 指定的日期
	 * @param month 加减的月数
	 * @return 计算后的日期
	 */
	public static String getAddMonths(String str, int month) {
		Date date = parseStringToDate(str);
		return parseDateToString(DateUtils.addMonths(date, month));
	}
	
	/**
	 * 得到指定日期加，减年数后的日期字符串。
	 * @param str 指定的日期
	 * @param year 加减的年数
	 * @return 计算后的日期
	 */
	public static String getAddYears(String str, int year) {
		Date date = parseStringToDate(str);
		return parseDateToString(DateUtils.addYears(date, year));
	}

	/**
	 * 功能：将日期转为标准格式YYYY-MM-DD
	 * @param String dt (YYYY-M-D,YYYY-M-DD,YYYY-MM-D)
	 */
	public static String formatDate(String dt) {
		String retDt = "";
		try {
			if (null == dt || dt.length() == 0)
				return "";
			else {
				String year = "";
				String month = "";
				String date = "";
				int idx = dt.indexOf("-", 5);
				if (idx == -1)
					return "";
				year = dt.substring(0, 4);
				month = dt.substring(5, idx);
				if (month.length() == 1)
					month = "0" + month;
				date = dt.substring(idx + 1);
				if (date.length() == 1)
					date = "0" + date;
				retDt = year + "-" + month + "-" + date;
			}
			return retDt;
		} catch (Exception e) {
			return "";
		}
	}
	
	/**
	 * 返回日期和时间，并按格式转换为字符串
	 * 例：2004-4-30 
	 */
    public static String formatDate(Date date) {
    	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    	if(date == null) {
    		return "";
    	}
        return sdf.format(date);
    }
    /**
     * 返回日期和时间，并按格式转换为字符串
     * 例：
     */
    public static String formatTime(Date date) {
    	if(date == null) {
    		return "";
    	}
    	SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
        return sdf.format(date);
    }

    /**
     * 返回日期和时间，并按格式转换为字符串
     * 例：2004-04-01 17:27:03
     */
    public static String formatDateTime(Date date) {
    	if(date == null) {
    		return "";
    	}
    	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(date);
    }
    /**
     * 返回日期和时间，并按格式转换为字符串
     * 例：2004-4-30 17:27:03
     */
    public static String formatDateTime2(Date date) {
    	if(date == null) {
    		return "";
    	}
    	SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        return sdf.format(date);
    }
    
    /**
     * 返回日期和时间，并按格式转换为字符串
     * 例：2004-4-30 17:27:03
     */
    public static String formatDateTime4(Date date) {
    	if(date == null) {
    		return "";
    	}
    	SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HHmmss");
        return sdf.format(date);
    }
    
	 /**
     * 比较两日期字符串的大小
     * 如果想等返回2，如果d1大于d2返回0，如果小于返回2
     * @param d1
     * @param d2
     * @return (d1>d2)?2:(d1=d2)?1:0
     */
    public static int compareDate(String d1, String d2) {
    	short vl = 1;
    	GregorianCalendar gc = new GregorianCalendar();
        gc.setTime(parseStringToDate(d1));
        int year = gc.get(Calendar.YEAR);
        int month = gc.get(Calendar.MONTH);
        int day = gc.get(Calendar.DAY_OF_MONTH);
        gc.setTime(parseStringToDate(d2));
        int tempYear = gc.get(Calendar.YEAR);
        int tempMonth = gc.get(Calendar.MONTH);
        int tempDay = gc.get(Calendar.DAY_OF_MONTH);
        if (year != tempYear) {
        	if (year>tempYear)
        		vl = 2;
        	else
        		vl = 0;
        }
        else {
        	if (month != tempMonth) {
        		if(month>tempMonth)
        			vl = 2;
        		else
        			vl = 0;
        	}
        	else {
        		if (day != tempDay) {
        			if (day > tempDay)
        				vl = 2;
        			else
        				vl = 0;
        		}
        	}
        }
        return vl;
    }
    
	/**
	 * 功能：将Date类型数据转换为YYYY-mm-dd 字符串,如果传入的参数日期是1900-01-01 ,那么返回的字符串为""
	 * @param date  需要转换的日期
	 * @return 转换后的字符串
	 */
	public static String dateToStr(Date date) {
		String retDate = dateToOriStr(date);
		if (retDate.equals("1900-01-01"))
			retDate = "";

		return retDate;
	}

	/**
	 * 功能：将Date类型数据转换为yyyy-MM-dd字符串
	 * @param date  需要转换的日期
	 * @return 转换后的字符串
	 */
	public static String dateToOriStr(Date date) {
		if (date == null)
			return "1900-01-01";
		SimpleDateFormat dateFormat = new SimpleDateFormat(
				deaultDateFormat);

		return dateFormat.format(date);
	}
	
	/**
	 * 功能：将Date类型数据转换为yyyy-MM-dd HH字符串
	 * @param date  需要转换的日期
	 * @return 转换后的字符串
	 */
	public static String dateToStrHH(Date date) {
		if (date == null)
			return "1900-01-01 00";
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH");

		return dateFormat.format(date);
	}

	/**
	 * 日期截取[去除时间部分]
	 * 例如: 将2008-06-10 00:00:00.0 转换为 2008-06-10
	 */
    public static String getSubDateString(String parDateString) {
    	String str = "";
    	if (parDateString == null) {
    		return str;
    	}
    	if (parDateString.length() == 10) {
    		return parDateString;
    	}
    	str = parDateString.substring(0, parDateString.indexOf(" "));
    	return str;
    }

    /**
     * 返回日期和时间，并按格式转换为字符串
     * 例：04-30 17:27
     */
    public static String formatDateTime3(Date date) {
    	if(date == null) {
    		return "";
    	}
    	SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm");
        return sdf.format(date);
    }
    
	public static void main(String... args) {
//		System.out.println(DateUtil.getIntervalDay("2008-1-2", "2008-2-2"));
//		System.out.println(DateUtil.getIntervalMonth("2008-1-2", "2008-2-2"));
//		System.out.println(DateUtil.getIntervalYear("2006-1-2", "2008-2-2"));
//		System.out.println("2005-03-05 -> " + DateUtil.parseStringToDate("2005-03-05"));
//		System.out.println("Now -> " + DateUtil.parseDateToString(new Date()));
//		System.out.println("add day -> " + DateUtil.getAddDays("2005-6-5", 10));
//		System.out.println("add month -> " + DateUtil.getAddMonths("2005-6-5", 10));
//		System.out.println("add year -> " + DateUtil.getAddYears("2005-6-5", 10));
//		System.out.println("add week -> " + DateUtil.getAddWeeks("2005-6-5", 10));
//		System.out.println("NOW -> " + DateUtil.getNowDate());
//		System.out.println("TIME -> " + DateUtil.getNowTime());
//		System.out.println("DateAndTime -> " + DateUtil.getNowDateTime());
//		System.out.println("Year -> " + DateUtil.getThisYear());
//		System.out.println("Month -> " + DateUtil.getThisMonth());
//		System.out.println("Day -> " + DateUtil.getToDayOfMonth());
//		System.out.println("Hour -> " + DateUtil.getHour());
//		System.out.println("Min ->" + DateUtil.getMinute());
//		System.out.println("Sec -> " + DateUtil.getSecond());
//		System.out.println("CompareDate -> " + DateUtil.compareDate("2008-3-6", "2008-3-6"));
//		System.out.println("getSubDateString() : " + DateUtil.getSubDateString("2008-06-10 00:00:00.0"));
//		System.out.println("getSubDateString() : " + DateUtil.getSubDateString(""));
//		String time = "";
//		Date date = com.eagle.util.DateUtil.parseStringToDate2(time);
//		System.out.println("现在: " + date);
//		System.out.println("现在: " + DateUtil.getNowDate());
//		System.out.println("比较: " + DateUtil.compareDate(DateUtil.getNowDate(), "2008-5-11"));
		
		 
		 
		
	}

}
